home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / magl / magl.c < prev    next >
C/C++ Source or Header  |  1991-10-18  |  24KB  |  998 lines

  1. /*
  2.  *                        'Magl.exp'         for FM-TOWNS
  3.  *
  4.  *                - MAKIchan Graphic loader is not 鮪だ! -
  5.  *
  6.  *                    Version 0.41    Update 1991/05/03
  7.  *
  8.  *                            programmed by MALOR
  9.  */
  10.  
  11. /*
  12.  *            1991/03/08    v0.01    正常に展開されたぞ
  13.  *                    10    v0.02    アセンブラ化して高速化!98にやっと勝てた…
  14.  *                                さらに、文字列操作命令を導入してみた。
  15.  *                    13    v0.03    ビット操作命令の導入を考えるが、サイクル数が
  16.  *                                違わないので、やっぱりやめた(T_T)
  17.  *                                256色/DOS互換モード対応・アセンブラ化
  18.  *                                オフセットロード対応
  19.  *                                画面はみ出しチェック強化(う~ん、手抜きじゃ)
  20.  *                    18    v0.04    MKI対応のため、仕様変更
  21.  *                    22    v0.05    ループ展開で、改良?改悪?
  22.  *                    25    v0.06    98版で採用されている1パス方式を試してみるが、
  23.  *                                今のバージョンに勝てなかった....
  24.  *                                だから、実は何も変わっていない。徒労だ....
  25.  *                    29    v0.10    MKIフォーマットにも対応
  26.  *                    30    v0.11    正式公開版仕様書を見てビックリ!
  27.  *                                随分変わっているんですね。で、手直しバージョン
  28.  *                                おまけで、ワイルドカード対応
  29.  *                 04/02    v0.20    ライブラリ化で大改造
  30.  *                                メモリに展開するようにして、大画面対応
  31.  *                                表示後の拡大縮小・スクロールに対応
  32.  *                    09    v0.30    展開時のエフェクト機能装備
  33.  *                    17    v0.31    yamato.magが表示できないバグ修正
  34.  *                                データの誤認バグ修正
  35.  *                                TOWNS-OS上でキー入力ができないバグ修正
  36.  *                                エフェクト時に480ライン目が表示されないバク修正
  37.  *                    27    v0.35    「256色まぐでーた」に本当に対応 :-)
  38.  *                                差分まぐろが表示できないバグ修正
  39.  *                                画像の左上でスクロールを止まるようにした。
  40.  *                 05/03    v0.40    フラグデータによる特化で高速化!
  41.  *                        v0.41    少しオプションを追加・変更
  42.  *                                差分まぐろがエフェクト表示できないバグ修正
  43.  *  今後の課題
  44.  *        ファイラーを付ける
  45.  *        セーバーを作ろう(^-^;)
  46.  *        ハイパフォーマンスセーバーはできるのだろうか…
  47.  */
  48.  
  49. #include <egb.h>
  50. #include <mos.h>
  51. #include <msdos.cf>
  52. #include <stdlib.h>
  53. #include <stdio.h>
  54. #include <string.h>
  55. #include "wild.h"
  56. #include "mag.h"
  57. #include "pixel.h"
  58.  
  59. #define VERSION    "0.41"
  60. #define UPDATE    "1991/05/03 17:35"
  61.  
  62. #define tolower(x) (((x)<='Z')&&((x)>='A')?((x)-'A'+'a'):(x))
  63.  
  64. #define Key_UP        0x1e
  65. #define Key_DOWN    0x1f
  66. #define Key_RIGHT    0x1c
  67. #define Key_LEFT    0x1d
  68. #define ESC            0x0b
  69.  
  70. #define PAD_UP        0x3e
  71. #define PAD_DOWN    0x3d
  72. #define PAD_RIGHT    0x37
  73. #define PAD_LEFT    0x3b
  74. #define PAD_BTN_A    0x2f
  75. #define PAD_BTN_B    0x1f
  76. #define PAD_RUN        0x33
  77. #define PAD_SELECT    0x3c
  78.  
  79. #define MOS_BTN_LEFT    1
  80. #define MOS_BTN_RIGHT    2
  81.  
  82. #define Effect_NUM        5
  83. #define Effect_Falcom    1
  84. #define Effect_Slide    2
  85. #define Effect_Sima1    3
  86. #define Effect_Sima2    4
  87. #define Effect_Mosaic    5
  88. #define Effect_Nijimi    6
  89.  
  90. #define CLS                0x01
  91. #define WAIT            0x02
  92. #define INFO            0x04
  93. #define LIST            0x08
  94. #define DEBUG            0x10
  95. #define SEARCH_STR        0x20
  96. #define SEARCH_FNAME    0x40
  97.  
  98. /* Prototype declaration */
  99.  
  100. int        effect_display(int effect,int dx,int dy);
  101. int        set_screen(int mode);
  102. int        key_scroll(int (*roll)(int arg,int dx,int dy),int dx,int dy);
  103. int        matta(void);
  104. void    init_scroll(void);
  105. int        scroll(int arg,int dx,int dy);
  106. int        scroll_mem(int arg,int dx,int dy);
  107. int        scroll_nijimi(int arg,int dx,int dy);
  108. int        crtc(int addr,int dat);
  109. int        get_second(void);
  110. int        find(char *s,char *d);
  111.  
  112. void falcom(int xbyte,int sy,int sofs,int slofs,int dseg,int dofs,int dlofs);
  113.     /* ファルコム効果      注意:dest.offsetは展開領域左下のアドレスを渡す */
  114. void slide(int xbyte,int sy,int sofs,int slofs,int dseg,int dofs,int dlofs);
  115. void sima2(int xbyte,int sy,int sofs,int slofs,int dseg,int dofs,int dlofs,int step);
  116. void mosaic(int xbyte,int sy,int sofs,int slofs,int dseg,int dofs,int dlofs,int dx,int dy,int midofs);
  117. void mosaic256(int xbyte,int sy,int sofs,int slofs,int dseg,int dofs,int dlofs,int dx,int dy,int midofs);
  118. void nijimi(int xbyte,int sy,int sofs,int slofs,int dseg,int dofs,int dlofs);
  119. int  setpal(int count,int wight,int nwight,char *beforepal,char *afterpal,int start);
  120. void cls(int xbyte,int sy,int dseg,int dofs,int dlofs);
  121.     /* These functions exist in 'effect.asm' */
  122.  
  123. /* Global Vari. */
  124.  
  125. char    egbwork[EgbWorkSize];        /* EGBライブラリ用ワーク */
  126. char    moswork[MosWorkSize];        /* MOUSEライブラリ用ワーク */
  127. char    apal[768],bpal[768];        /* 「ぢわっ」と表示用パレット */
  128. static int ny=0;                    /* スクロール用ワーク */
  129. static int vx=0,vy=0,rate=0;
  130.  
  131. /* Main program */
  132.  
  133. int        effect_display(int effect,int dx,int dy)
  134. {
  135.     static int count=0;
  136.     int ssx,sx,sx2,sy,sy2,y,yy,i;
  137.  
  138.     sx = ((rx-lx+1)>640)?640:(rx-lx+1);        /* エフェクト時の横幅 */
  139.     sx2 = rx-lx+1;                            /* 全画面表示時の横幅 */
  140.     ssx = (rx/8-lx/8+1)*8;                    /* 8ドット拡張後の横幅 */
  141.     sy = ((ry-ly>479)?480:(ry-ly+1));
  142.     sy2 = ((ry-ly>511)?512:(ry-ly+1));
  143.  
  144.     if (!(screen_mode&COL256)) {
  145.         sx2 = sx2+sx2%2;
  146.         sx = sx+sx%2;
  147.     }
  148.  
  149.     if (effect==-1)
  150.         effect = (rand()*Effect_NUM)/RAND_MAX + 1 ;
  151.  
  152.     switch(effect) {
  153.         case Effect_Falcom :
  154.             if (screen_mode&COL256)
  155.                 falcom(sx,sy,(int)vram+lx%4,ssx,0x010c,(dx+(dy+sy-1)*1024),1024);
  156.             else
  157.                 falcom(sx/2,sy,(int)vram+(lx%8)/2,ssx/2,0x0104,(dx+(dy+sy-1)*1024)/2,512);
  158.             display(0,0,sx2,sy2,dx,dy);
  159.             break;
  160.         case Effect_Slide :
  161.             if (screen_mode&COL256)
  162.                 slide(sx,sy,(int)vram+lx%4,ssx,0x010c,(dx+dy*1024),1024);
  163.             else
  164.                 slide(sx/2,sy,(int)vram+(lx%8)/2,ssx/2,0x0104,(dx+dy*1024)/2,512);
  165.             display(0,0,sx2,sy2,dx,dy);
  166.             break;
  167.         case Effect_Sima1 :
  168.             for (yy=0;yy<20;yy++)
  169.                 for(y=yy;y<sy;(y+=20)) {
  170.                     display(0,y,sx,1,dx,dy+y);
  171.                     for(i=0;i<300;i++);
  172.                 }
  173.             display(0,0,sx2,sy2,dx,dy);
  174.             break;
  175.         case Effect_Sima2 :
  176.             i=23;
  177.             while(((sx*sy)%i)==0) i++;
  178.             if (screen_mode&COL256)
  179.                 sima2(sx,sy,(int)vram+lx%4,ssx,0x010c,(dx+dy*1024),1024,i);
  180.             else
  181.                 sima2(sx/2,sy,(int)vram+(lx%8)/2,ssx/2,0x0104,(dx+dy*1024)/2,512,i);
  182.             display(0,0,sx2,sy2,dx,dy);
  183.             break;
  184.         case Effect_Mosaic :
  185.             if (screen_mode&COL256)
  186.                 for(i=64;i>0;i-=4)
  187.                     mosaic256(sx,sy,(int)vram+lx%4,ssx,0x010c,(dx+dy*1024),1024,i,i,i/2+(i/2)*ssx);
  188.             else
  189.                 for(i=64;i>0;i-=4)
  190.                     mosaic(sx/2,sy,(int)vram+(lx%8)/2,ssx/2,0x0104,(dx+dy*1024)/2,512,i/2,i,i/4+((i/2)*ssx)/2);
  191.             display(0,0,sx2,sy2,dx,dy);
  192.             break;
  193.         case Effect_Nijimi :
  194.             screen_mode |= COL256;
  195.             if (count==0||(image_mode&COL256)) {
  196.                 cls(1024,512,0x010c,0,1024);
  197.                 set_screen(screen_mode);            /* 最初は真っ暗 */
  198.                 for(i=0;i<768;i++)
  199.                     bpal[i]=0;
  200.                 for(;setpal(51,0,0,bpal,bpal,0)==0;);
  201.                 for(;setpal(51,0,0,bpal+ 51*3,bpal+ 51*3,51 )==0;);
  202.                 for(;setpal(51,0,0,bpal+102*3,bpal+102*3,102)==0;);
  203.                 for(;setpal(51,0,0,bpal+153*3,bpal+153*3,153)==0;);
  204.                 for(;setpal(52,0,0,bpal+204*3,bpal+204*3,204)==0;);
  205.             }
  206.             if (image_mode&COL256) {
  207.                 count = -1;
  208.                 cls(1024,512,0x010c,0,1024);
  209.                 display(0,0,sx2,sy2,dx,dy);
  210.                 for(i=0;i<256;i++) {
  211.                     apal[i*3  ] = pal[i*3+2];
  212.                     apal[i*3+1] = pal[i*3+1];
  213.                     apal[i*3+2] = pal[i*3  ];
  214.                 }
  215.             } else {
  216.                 outpb(0x458,0);
  217.                 outpb(0x45a,((count%2==0)?0x0f:0xf0));
  218.                 outpb(0x45b,((count%2==0)?0x0f:0xf0));
  219.                 outpb(0x458,1);
  220.                 outpb(0x45a,((count%2==0)?0x0f:0xf0));
  221.                 outpb(0x45b,((count%2==0)?0x0f:0xf0));
  222.                 cls(1024,512,0x010c,0,1024);
  223.                 nijimi(sx2/2,sy2,(int)vram+(lx%8)/2,ssx/2,0x010c,dx+dy*1024,1024);
  224.                 outpb(0x458,0);
  225.                 outpb(0x45a,0xff);
  226.                 outpb(0x45b,0xff);
  227.                 outpb(0x458,1);
  228.                 outpb(0x45a,0xff);
  229.                 outpb(0x45b,0xff);
  230.                 if(count%2==0)
  231.                     for(i=0;i<256;i++) {
  232.                         apal[i*3  ] = pal[(i&0xf)*3+2];
  233.                         apal[i*3+1] = pal[(i&0xf)*3+1];
  234.                         apal[i*3+2] = pal[(i&0xf)*3  ];
  235.                     }
  236.                 else
  237.                     for(i=0;i<256;i++) {
  238.                         apal[i*3  ] = pal[(i>>4)*3+2];
  239.                         apal[i*3+1] = pal[(i>>4)*3+1];
  240.                         apal[i*3+2] = pal[(i>>4)*3  ];
  241.                     }
  242.             }
  243.             for(i=0;i<65;i++) {
  244.                 for(;setpal(51,i,64-i,apal,bpal,0)==0;);
  245.                 for(;setpal(51,i,64-i,apal+ 51*3,bpal+ 51*3,51 )==0;);
  246.                 for(;setpal(51,i,64-i,apal+102*3,bpal+102*3,102)==0;);
  247.                 for(;setpal(51,i,64-i,apal+153*3,bpal+153*3,153)==0;);
  248.                 for(;setpal(52,i,64-i,apal+204*3,bpal+204*3,204)==0;);
  249.             }
  250.             for(i=0;i<768;i++)
  251.                 bpal[i]=apal[i];
  252.             count++;
  253.             break;
  254.         default :
  255.             display(0,0,sx2,sy2,dx,dy);
  256.             break;
  257.     }
  258.  
  259.     return TRUE;
  260.  
  261. }
  262.  
  263. void init_scroll(void)
  264. {
  265.     int yrate;
  266.  
  267.     ny = 0; vy = 0; vx = 0; rate = 0;
  268.  
  269.     if (screen_mode&LINE200)
  270.         yrate = rate+1;
  271.     else
  272.         yrate = rate;
  273.     if (screen_mode&COL256) {
  274.         crtc(17,(vx+vy*1024)/8);
  275.         crtc(21,(vx+vy*1024)/8);
  276.         crtc(27,(yrate<<12)|(rate<<8)|(yrate<<4)|rate);
  277.     } else {
  278.         crtc(17,(vx+vy*1024)/8);
  279.         crtc(27,(yrate<<4)|(rate));
  280.     }
  281.  
  282. }
  283.  
  284. int scroll(int arg,int dx,int dy)
  285. {
  286.     int yrate;
  287.  
  288.     switch(arg) {
  289.         case Scroll_UP :
  290.             vy--;
  291.             if (vy==-1) vy = 0;
  292.             break;
  293.         case Scroll_DOWN :
  294.             vy++;
  295.             if (vy==512) vy = 0;
  296.             break;
  297.         case Scroll_RIGHT :
  298.             vx++;
  299.             if (vx==1024) vx = 0;
  300.             break;
  301.         case Scroll_LEFT :
  302.             vx--;
  303.             if (vx==-1) vx = 0;
  304.             break;
  305.         case Zoom_UP :
  306.             rate++;
  307.             if (screen_mode&LINE200) {
  308.                 if (rate==15)
  309.                     rate = 14;
  310.                 }
  311.             else {
  312.                 if (rate==16)
  313.                     rate = 15;
  314.             }
  315.             break;
  316.         case Zoom_DOWN :
  317.             rate--;
  318.             if (rate==-1)
  319.                 rate = 0;
  320.             break;
  321.         default :
  322.             return FALSE;
  323.     }
  324.     if (screen_mode&LINE200)
  325.         yrate = rate+1;
  326.     else
  327.         yrate = rate;
  328.     if (screen_mode&COL256) {
  329.         crtc(17,(vx+vy*1024)/8);
  330.         crtc(21,(vx+vy*1024)/8);
  331.         crtc(27,(yrate<<12)|(rate<<8)|(yrate<<4)|rate);
  332.     } else {
  333.         crtc(17,(vx+vy*1024)/8);
  334.         crtc(27,(yrate<<4)|(rate));
  335.     }
  336.     return TRUE;
  337. }
  338.  
  339.  
  340. int scroll_mem(int arg,int dx,int dy)
  341. {
  342.     int yrate;
  343.  
  344.     switch(arg) {
  345.         case Scroll_UP :
  346.             ny--;
  347.             if (ny==-1) {
  348.                 ny = 0;
  349.                 break;
  350.                 /* ny = ry - ly; */
  351.             }
  352.             display(lx,ny,rx-lx+1,1,dx,((vy-1)<0)?511:(vy-1));
  353.             vy--;
  354.             if (vy==-1) vy = 511;
  355.             break;
  356.         case Scroll_DOWN :
  357.             ny++;
  358.             if (ny==(ry-ly+1))
  359.                 ny = 0;
  360.             display(lx,((511+ny)>(ry-ly))?(511+ny+ly-ry-1):511+ny
  361.                 ,rx-lx+1,1,dx,((vy-1)<0)?511:(vy-1));
  362.             vy++;
  363.             if (vy==512) vy = 0;
  364.             break;
  365.         case Scroll_RIGHT :
  366.             vx++;
  367.             if (vx==1024) vx = 0;
  368.             break;
  369.         case Scroll_LEFT :
  370.             vx--;
  371.             if (vx==-1) vx = 0;
  372.             break;
  373.         case Zoom_UP :
  374.             rate++;
  375.             if (screen_mode&LINE200) {
  376.                 if (rate==15)
  377.                     rate = 14;
  378.                 }
  379.             else {
  380.                 if (rate==16)
  381.                     rate = 15;
  382.             }
  383.             break;
  384.         case Zoom_DOWN :
  385.             rate--;
  386.             if (rate==-1)
  387.                 rate = 0;
  388.             break;
  389.         default :
  390.             return FALSE;
  391.     }
  392.     if (screen_mode&LINE200)
  393.         yrate = rate+1;
  394.     else
  395.         yrate = rate;
  396.     if (screen_mode&COL256) {
  397.         crtc(17,(vx+vy*1024)/8);
  398.         crtc(21,(vx+vy*1024)/8);
  399.         crtc(27,(yrate<<12)|(rate<<8)|(yrate<<4)|rate);
  400.     } else {
  401.         crtc(17,(vx+vy*1024)/8);
  402.         crtc(27,(yrate<<4)|(rate));
  403.     }
  404.     return TRUE;
  405.  
  406. }
  407.  
  408. int scroll_nijimi(int arg,int dx,int dy)
  409. {
  410.     int yrate;
  411.  
  412.     switch(arg) {
  413.         case Scroll_UP :
  414.             ny--;
  415.             if (ny==-1) {
  416.                 ny = 0;
  417.                 break;
  418.                 /* ny = ry - ly; */
  419.             }
  420.             nijimi((rx-lx+1)/2,1,(int)vram+(lx%8+lx+ny*(rx-lx+1))/2
  421.                 ,(rx-lx+1)/2,0x10c,dx+(((vy-1)<0)?511:(vy-1))*1024,1024);
  422.             vy--;
  423.             if (vy==-1) vy = 511;
  424.             break;
  425.         case Scroll_DOWN :
  426.             ny++;
  427.             if (ny==(ry-ly+1))
  428.                 ny = 0;
  429.             nijimi((rx-lx+1)/2,1,
  430.                 (int)vram+(lx%8+lx+(((511+ny)>(ry-ly))?(511+ny+ly-ry-1):511+ny)
  431.                                                             *(rx-lx+1))/2,
  432.                 (rx-lx+1)/2,0x10c,dx+(((vy-1)<0)?511:(vy-1))*1024,1024);
  433.             vy++;
  434.             if (vy==512) vy = 0;
  435.             break;
  436.         case Scroll_RIGHT :
  437.             vx++;
  438.             if (vx==1024) vx = 0;
  439.             break;
  440.         case Scroll_LEFT :
  441.             vx--;
  442.             if (vx==-1) vx = 0;
  443.             break;
  444.         case Zoom_UP :
  445.             rate++;
  446.             if (screen_mode&LINE200) {
  447.                 if (rate==15)
  448.                     rate = 14;
  449.                 }
  450.             else {
  451.                 if (rate==16)
  452.                     rate = 15;
  453.             }
  454.             break;
  455.         case Zoom_DOWN :
  456.             rate--;
  457.             if (rate==-1)
  458.                 rate = 0;
  459.             break;
  460.         default :
  461.             return FALSE;
  462.     }
  463.     if (screen_mode&LINE200)
  464.         yrate = rate+1;
  465.     else
  466.         yrate = rate;
  467.     crtc(17,(vx+vy*1024)/8);
  468.     crtc(21,(vx+vy*1024)/8);
  469.     crtc(27,(yrate<<12)|(rate<<8)|(yrate<<4)|rate);
  470.     return TRUE;
  471.  
  472. }
  473.  
  474. int            crtc(int addr,int dat)
  475. {
  476.     outpb(0x440,addr);
  477.     outpb(0x443,dat>>8);
  478.     outpb(0x442,dat&0xff);
  479.     return TRUE;
  480. }
  481.  
  482. int        set_screen(int mode)
  483. {
  484.     static    int    preplane=0;
  485.  
  486.     if ((mode&(COL256|LINE200))==(preplane&(COL256|LINE200))) return TRUE;
  487.  
  488.     preplane = mode;
  489.  
  490.     if (mode&DOS) return TRUE;
  491.  
  492.     if (mode&COL256) {                    /* 256色モード */
  493.         EGB_resolution(egbwork,0,12);
  494.         EGB_writePage(egbwork,0);
  495.         EGB_displayPage(egbwork,0,1);    /* レイア0に書き込む */
  496.     } else {                            /* 16色モード */
  497.         EGB_resolution(egbwork,0,3);
  498.         EGB_resolution(egbwork,1,3);
  499.         EGB_writePage(egbwork,0);
  500.         EGB_displayPage(egbwork,1,1);    /* レイア0に書き込む */
  501.     }
  502.     
  503.     if (mode&LINE200)                    /* 縦横比2:1に設定 */
  504.         crtc(27,(1<<12)|(0<<8)|(1<<4)|0);
  505.         /* EGB_displayStart(egbwork,2,1,2); */
  506.  
  507.     return TRUE;
  508. }
  509.  
  510. int        matta(void)
  511. {
  512.     Registers.AX.R = 0x0C00;            /* キーバッファの初期化 */
  513.     calldos();
  514.  
  515.     for(;;) {
  516.         Registers.AX.R = 0x0600;        /* 直接コンソール入力 */
  517.         Registers.DX.R = 0x00FF;
  518.         calldos();
  519.         if (tolower(Registers.AX.LH.L)==(int)'q'||
  520.                 tolower(Registers.AX.LH.L)=='e'||
  521.                     Registers.AX.LH.L==ESC)
  522.             return FALSE;
  523.         if (Registers.AX.LH.L!=0)
  524.             break;
  525.         if((inpb(0x04d0)&0x30)!=0x30)        /* パッド・マウスチェック */
  526.             break;
  527.         if((inpb(0x04d2)&0x30)!=0x30)
  528.             break;
  529.     }
  530.  
  531.     return TRUE;
  532.  
  533. }
  534.  
  535. int        key_scroll(int (*roll)(int arg,int dx,int dy),int dx,int dy)
  536. {
  537.     int flag,now,x,y,btn,dummy;
  538.  
  539.     MOS_motion(&x,&y);
  540.     x = 0;
  541.     y = 0;
  542.  
  543.     flag = TRUE;
  544.     for(;flag;) {
  545.         Registers.AX.R = 0x0600;        /* 直接コンソール入力 */
  546.         Registers.DX.R = 0x00FF;
  547.         calldos();
  548.         switch(tolower(Registers.AX.LH.L)) {
  549.             case Key_UP :
  550.                 (*roll)(Scroll_UP,dx,dy);
  551.                 break;
  552.             case Key_DOWN :
  553.                 (*roll)(Scroll_DOWN,dx,dy);
  554.                 break;
  555.             case Key_RIGHT :
  556.                 (*roll)(Scroll_RIGHT,dx,dy);
  557.                 break;
  558.             case Key_LEFT :
  559.                 (*roll)(Scroll_LEFT,dx,dy);
  560.                 break;
  561.             case 'e' :
  562.             case 'q' :
  563.                 return FALSE;
  564.             case 'n' :
  565.                 flag = FALSE;
  566.                 break;
  567.             case 'z' :
  568.             case CR :
  569.                 (*roll)(Zoom_UP,dx,dy);
  570.                 break;
  571.             case 'd' :
  572.             case ' ' :
  573.                 (*roll)(Zoom_DOWN,dx,dy);
  574.                 break;
  575.         }
  576.         switch((now=inpb(0x4d0)&0x3f)) {
  577.             case PAD_UP :
  578.                 (*roll)(Scroll_UP,dx,dy);
  579.                 break;
  580.             case PAD_DOWN :
  581.                 (*roll)(Scroll_DOWN,dx,dy);
  582.                 break;
  583.             case PAD_RIGHT :
  584.                 (*roll)(Scroll_RIGHT,dx,dy);
  585.                 break;
  586.             case PAD_LEFT :
  587.                 (*roll)(Scroll_LEFT,dx,dy);
  588.                 break;
  589.             case PAD_RUN :
  590.             case PAD_SELECT :
  591.                 flag = FALSE;
  592.                 break;
  593.             case PAD_BTN_A :
  594.                 (*roll)(Zoom_UP,dx,dy);
  595.                 for(;now==(inpb(0x4d0)&0x3f););
  596.                 break;
  597.             case PAD_BTN_B :
  598.                 (*roll)(Zoom_DOWN,dx,dy);
  599.                 for(;now==(inpb(0x4d0)&0x3f););
  600.                 break;
  601.         }
  602.         MOS_motion(&x,&y);
  603.         if (x>0)
  604.             for(;x!=0;x--) (*roll)(Scroll_RIGHT,dx,dy);
  605.         else
  606.             for(;x!=0;x++) (*roll)(Scroll_LEFT,dx,dy);
  607.         if (y>0)
  608.             for(;y!=0;y--) (*roll)(Scroll_DOWN,dx,dy);
  609.         else
  610.             for(;y!=0;y++) (*roll)(Scroll_UP,dx,dy);
  611.         MOS_rdpos(&now,&dummy,&dummy);
  612.         btn = now;
  613.         if (now==MOS_BTN_LEFT) {
  614.             for(;now==btn;) MOS_rdpos(&now,&dummy,&dummy);
  615.             (*roll)(Zoom_UP,dx,dy);
  616.         }
  617.         if (now==MOS_BTN_RIGHT) {
  618.             for(;now==btn;) MOS_rdpos(&now,&dummy,&dummy);
  619.             (*roll)(Zoom_DOWN,dx,dy);
  620.         }
  621.         if (now==(MOS_BTN_LEFT|MOS_BTN_RIGHT))
  622.             flag = FALSE;
  623.     }
  624.  
  625.     return TRUE;
  626.  
  627. }
  628.  
  629. int        get_second(void)
  630. {
  631.     Registers.AX.LH.H = 0x2c;                /* 時間取得ファンクションコール */
  632.  
  633.     calldos();
  634.  
  635.     return Registers.DX.LH.H;
  636. }
  637.  
  638. int        find(char *s,char *d)
  639. {
  640.     for(;*s!='\0';s++)
  641.         if ((tolower(*s))==(tolower(*d)))
  642.             if (stringcmp(d,s))
  643.                 return TRUE;
  644.  
  645.     return FALSE;
  646. }
  647.  
  648. void    main(int argc,char *argv[])
  649. {
  650.     int n,i,mode=0,view_mode=WAIT,dx=-1,dy=0,dc;
  651.     int ddx,ddy,effect=0,ret=TRUE;
  652.     char *p,path[BufSize],fname[BufSize];
  653.     char search_fname[BufSize],search_str[BufSize];
  654.     FILE *fp;
  655.     DTA *dta;
  656.  
  657.     mode = 0;
  658.     view_mode = WAIT;
  659.     dx = -1;
  660.     dy = 0;
  661.     effect = 0;
  662.     ret = TRUE;
  663.  
  664.     /*
  665.     EGB_init(egbwork,EgbWorkSize);
  666.     fp=fopen("g:\\mag\\yamato.mag","rb");
  667.     mag_get_head(fp);
  668.     set_palette(fp);
  669.     printf("magl : mag decode start\n");
  670.     mag_decode(fp,0,0,0);
  671.     key_scroll(scroll_mem,0,0);
  672.     exit(0);
  673.     */
  674.  
  675.     if (argc==1) {
  676.         printf("MAGloader 'magl.exp'    Version "VERSION"\n\n"
  677.                " [Usage ] : run386 magl [{/|-}<Option>] <filename> ・・・ \n"
  678.                " [Option] : -lm          load as ms-dos screen mode\n"
  679.                "            -lv          load to vram\n"
  680.                "            -d           comment list\n"
  681.                "            -i           information list\n"
  682.                "            -f <fname>   display data which follow this file\n"
  683.                "            -u <string>  display data which is including this string\n"
  684.                "            -o [<x> <y>] display Offset\n"
  685.                "            -k[+/-]      key wait flag (default=on)\n"
  686.                "            -c[+/-]      clear screen flag (default=off)\n"
  687.                "            -e [<num>]   special effect\n"
  688.                "            -#           display revision\n");
  689.         exit(0);
  690.     }
  691.  
  692.     for(n=1;n<argc;)                                /* option process */
  693.         if (argv[n][0]=='-'||argv[n][0]=='/') {
  694.             switch(tolower(argv[n][1])) {
  695.                 case 'l' :
  696.                     if (tolower(argv[n][2])=='m')
  697.                         mode |= DOS;
  698.                     else if (tolower(argv[n][2])=='v')
  699.                         mode |= VRAM;
  700.                     dc = 1;
  701.                     break;
  702.                 case 'o' :
  703.                     if (argv[n+1][0]>'0'&&argv[n+1][0]<'9') {
  704.                         dx = atoi(argv[n+1]);
  705.                         dy = atoi(argv[n+2]);
  706.                         dc = 3;
  707.                     } else {
  708.                         dx = 0;
  709.                         dy = 0;
  710.                         dc = 1;
  711.                     }
  712.                     break;
  713.                 case 'k' :
  714.                     switch(argv[n][2]) {
  715.                         case '+' :
  716.                             view_mode |= WAIT;
  717.                             break;
  718.                         case '-' :
  719.                             view_mode &= (~WAIT);
  720.                             break;
  721.                         default :
  722.                             view_mode ^= WAIT;
  723.                             break;
  724.                     }
  725.                     dc = 1;
  726.                     break;
  727.                 case 'c' :
  728.                     switch(argv[n][2]) {
  729.                         case '+' :
  730.                             view_mode |= CLS;
  731.                             break;
  732.                         case '-' :
  733.                             view_mode &= (~CLS);
  734.                             break;
  735.                         default :
  736.                             view_mode ^= CLS;
  737.                             break;
  738.                     }
  739.                     dc = 1;
  740.                     break;
  741.                 case '@' :
  742.                     view_mode |= DEBUG;
  743.                 case 'i' :
  744.                     view_mode |= INFO;
  745.                     dc = 1;
  746.                     break;
  747.                 case 'd' :
  748.                     view_mode |= LIST;
  749.                     mode |= DOS;
  750.                     dc = 1;
  751.                     break;
  752.                 case 'u' :
  753.                     view_mode |= SEARCH_STR;
  754.                     strcpy(search_str,argv[n+1]);
  755.                     dc = 2;
  756.                     break;
  757.                 case 'f' :
  758.                     view_mode |= SEARCH_FNAME;
  759.                     strcpy(search_fname,argv[n+1]);
  760.                     dc = 2;
  761.                     break;
  762.                 case 'e' :
  763.                     if (argv[n][2]!='\0') {
  764.                         effect = atoi(argv[n]+2);
  765.                         dc = 1;
  766.                         break;
  767.                     }
  768.                     if (argv[n+1][0]>'0'&&argv[n+1][0]<'9') {
  769.                         effect = atoi(argv[n+1]);
  770.                         dc = 2;
  771.                     } else {
  772.                         effect = -1;
  773.                         dc = 1;
  774.                     }
  775.                     break;
  776.                 case '#' :
  777.                     printf(
  778.                         "          'magl.exp' for FM-Towns\n"
  779.                         " - MAKIchan Graphic loader is not 鮪だ! - \n"
  780.                         "\n"
  781.                         "  Version "VERSION"    update "UPDATE"\n"
  782.                         );
  783.                     exit(0);
  784.                     break;
  785.                 default :
  786.                     printf("\nunidentified option : %s\n",argv[n]);
  787.                     dc = 1;
  788.                     break;
  789.                 }
  790.             for(i=n;i<argc-dc;i++)
  791.                 argv[i] = argv[i+dc];
  792.             argc -= dc;
  793.         } else
  794.             n++;
  795.  
  796.     /* 「ぢわっ」と表示は非DOSモードのみ */
  797.     if (effect==Effect_Nijimi) {
  798.         mode = mode&(~DOS);
  799.     }
  800.  
  801.     srand((unsigned int)get_second());
  802.     if (!(mode&DOS)) {
  803.         EGB_init(egbwork,EgbWorkSize);
  804.         EGB_writePage(egbwork,0);
  805.         EGB_displayPage(egbwork,1,1);    /* レイア0に書き込む */
  806.         MOS_start(moswork,MosWorkSize);
  807.         MOS_disp(0);
  808.     }
  809.  
  810.     printf(
  811. "filename mode   saved user               memo\n"
  812. "======== ======= ==== ================== =======================================");
  813.  
  814.     for (n=1;n<argc;n++) {
  815.         *path = '\0';
  816.         for (;;) {
  817.             if (*path=='\0') {
  818.                 strcpy(path,argv[n]);
  819.                 if (getext(path)==NULL) {
  820.                     strcat(path,".*");
  821.                 }
  822.                 dta=search(path,0,fname);
  823.             } else
  824.                 dta=next(path,0,fname);
  825.             if (*fname=='\0')
  826.                 break;
  827.  
  828.             if (view_mode&SEARCH_FNAME)
  829.                 if (stringcmp(search_fname,getname(fname)))
  830.                     view_mode &= (~SEARCH_FNAME);
  831.                 else
  832.                     continue;
  833.  
  834.             fp = (FILE *)NULL;
  835.             if ((fp=fopen(fname,"rb"))==NULL) {
  836.                 printf("magl : can't open file\n");
  837.                 continue;
  838.             }
  839.  
  840.             if (mag_get_head(fp)) {
  841.                 if (view_mode&SEARCH_STR)
  842.                     if (!find(comment+8,search_str)) {
  843.                         fclose(fp);
  844.                         continue;
  845.                     }
  846.                 for (p=getname(fname),i=0;i<8;i++)
  847.                     putchar(((*p=='.')?' ':*p++));        /* ファイル名出力 */
  848.                 putchar(' ');
  849.                 for (p=comment,i=0;i<70;i++)            /* コメント出力 */
  850.                     putchar(((*p=='\0')?' ':*p++));
  851.                 putchar(0x0d);
  852.                 putchar(0x0a);
  853.                 if (view_mode&INFO)
  854.                     printf(
  855. "                                         [rate]:%6d/%6d (%3d%%)\n"
  856. "                                         [saved rectangle]:(%3d,%3d)-(%3d,%3d)\n"
  857. "                                         [machine]:$%2x [flag]:$%2x [screen]:$%2x\n"
  858.                     ,dta->size,siza*32,(dta->size)*100/siza/32
  859.                     ,lx,ly,rx,ry,maghead.machine,maghead.rflg,maghead.screen);
  860.                 if (view_mode&DEBUG)
  861.                     printf( "+------+OFFSET-+--SIZE-+\n"
  862.                             "|flag a| %5d | %5d |\n"
  863.                             "|flag b| %5d | %5d |\n"
  864.                             "|pixel | %5d | %5d |\n"
  865.                             "+------+-------+-------+\n"
  866.                     ,maghead.offa,siza,maghead.offb
  867.                     ,maghead.sizb,maghead.offp,maghead.sizp);
  868.                 if (view_mode&LIST) {                    /* リスティング */
  869.                     fclose(fp);
  870.                     continue;
  871.                 }
  872.                 screen_mode |= mode;
  873.                 if(mode&VRAM) {
  874.                     if (view_mode&CLS)
  875.                         cls(1024,512,0x010c,0,1024);
  876.                     set_screen(screen_mode);
  877.                     set_palette();
  878.                 }
  879.                 /* printf("magl : start mag_decode \n"); */
  880.                 mag_decode(fp,mode,dx,dy);
  881.             } else if (mki_get_head(fp)) {
  882.                 if (view_mode&SEARCH_STR)
  883.                     if (!find(mkihead.comment,search_str)) {
  884.                         fclose(fp);
  885.                         continue;
  886.                     }
  887.                 for (p=getname(fname),i=0;i<8;i++)
  888.                     putchar(((*p=='.')?' ':*p++));
  889.                 printf(" %s",mkihead.id);
  890.                 putchar(0x0d);
  891.                 putchar(0x0a);
  892.                 if (view_mode&INFO)
  893.                     printf(
  894. "                                         [rate]:%6d/%6d (%3d%%)\n"
  895. "                                         [saved rectangle]:(  0,  0)-(639,399)\n"
  896.                     ,dta->size,12800,(dta->size)/128);
  897.                 if (view_mode&DEBUG)
  898.                     printf( "+------+--SIZE-+------+--SIZE-+\n"
  899.                             "|flag a| %5d |flag b| %5d |\n"
  900.                             "|pixela| %5d |pixelb| %5d |\n"
  901.                             "+------+-------+------+--SIZE-+\n"
  902.                     ,maghead.offa,siza,maghead.offb
  903.                     ,maghead.sizb,maghead.offp,maghead.sizp);
  904.                 if (view_mode&LIST) {
  905.                     fclose(fp);
  906.                     continue;
  907.                 }
  908.                 screen_mode |= mode;
  909.                 if(mode&VRAM) {
  910.                     if (view_mode&CLS)
  911.                         cls(1024,512,0x010c,0,1024);
  912.                     set_screen(screen_mode);
  913.                     set_palette();
  914.                 }
  915.                 mki_decode(fp,mode,dx,dy);
  916.             } else {
  917.                 fclose(fp);
  918.                 continue;
  919.             }
  920.  
  921.             if (dx==-1) {                /* VRAM表示位置調整 */
  922.                 ddx = lx;
  923.                 ddy = ly;
  924.             } else {
  925.                 ddx = dx;
  926.                 ddy = dy;
  927.             }
  928.  
  929.             if (mode&DOS) {            /* x方向にはみ出す時は抑止 */
  930.                 if (ddx+rx-lx+1>640)
  931.                     ddx = 0;
  932.             } else {
  933.                 if (ddx+rx-lx+1>1024)
  934.                     ddx = 0;
  935.             }
  936.  
  937.             fclose(fp);
  938.  
  939.             if ((!(mode&VRAM))&&(effect!=Effect_Nijimi)) {
  940.                 if (view_mode&CLS)
  941.                     cls(1024,512,0x010c,0,1024);
  942.                 set_screen(screen_mode);
  943.                 set_palette();
  944.             }
  945.             
  946.             if (view_mode&WAIT)                /* 展開後処理 */
  947.                 if (vram==NULL)
  948.                     if (mode&DOS)
  949.                         ret=matta();
  950.                     else {
  951.                         init_scroll();
  952.                         ret=key_scroll(scroll,0,0);
  953.                         init_scroll();
  954.                     }
  955.                 else {
  956.                     if ((!(mode&DOS))&&(effect!=0))
  957.                         effect_display(effect,ddx,ddy);
  958.                     else
  959.                         display(0,0,rx-lx+1,((ry-ly>511)?512:(ry-ly+1)),ddx,ddy);
  960.                     if ((effect==Effect_Nijimi)&&(!(image_mode&COL256))) {
  961.                         init_scroll();
  962.                         if (ry-ly+1>512)
  963.                             ret=key_scroll(scroll_nijimi,ddx,ddy);
  964.                         else
  965.                             ret=key_scroll(scroll,0,0);
  966.                         init_scroll();
  967.                     } else if (mode&DOS)
  968.                         ret=matta();
  969.                     else {
  970.                         init_scroll();
  971.                         if (ry-ly+1>512)
  972.                             ret=key_scroll(scroll_mem,ddx,ddy);
  973.                         else
  974.                             ret=key_scroll(scroll,0,0);
  975.                         init_scroll();
  976.                     }
  977.                 }
  978.             else
  979.                 if (vram!=NULL)
  980.                     if ((!(mode&DOS))&&effect!=0)
  981.                         effect_display(effect,ddx,ddy);
  982.                     else
  983.                         display(0,0,rx-lx+1,((ry-ly>511)?512:(ry-ly+1)),ddx,ddy);
  984.             if (vram!=NULL)                /* イメージ格納域開放 */
  985.                 free(vram);
  986.  
  987.             if (ret==FALSE)                /* 中断して脱出 */
  988.                 goto Exit;
  989.  
  990.         }
  991.     }
  992.  
  993. Exit:
  994.     if (!(mode&DOS))
  995.         MOS_end();
  996.  
  997. }
  998.